home *** CD-ROM | disk | FTP | other *** search
/ Visual Basic Graphics Programming (2nd Edition) / Visual Basic Graphics Programming 2nd Edition.iso / Src / Ch12 / RotAt.frm (.txt) < prev    next >
Visual Basic Form  |  1999-06-16  |  3KB  |  117 lines

  1. VERSION 5.00
  2. Begin VB.Form frmRotAt 
  3.    Caption         =   "RotAt"
  4.    ClientHeight    =   4005
  5.    ClientLeft      =   2325
  6.    ClientTop       =   495
  7.    ClientWidth     =   4215
  8.    KeyPreview      =   -1  'True
  9.    LinkTopic       =   "Form1"
  10.    PaletteMode     =   1  'UseZOrder
  11.    ScaleHeight     =   4005
  12.    ScaleWidth      =   4215
  13.    Begin VB.PictureBox picCanvas 
  14.       Height          =   3975
  15.       Left            =   0
  16.       ScaleHeight     =   -7
  17.       ScaleLeft       =   -1
  18.       ScaleMode       =   0  'User
  19.       ScaleTop        =   6
  20.       ScaleWidth      =   7
  21.       TabIndex        =   0
  22.       Top             =   0
  23.       Width           =   4215
  24.    End
  25. Attribute VB_Name = "frmRotAt"
  26. Attribute VB_GlobalNameSpace = False
  27. Attribute VB_Creatable = False
  28. Attribute VB_PredeclaredId = True
  29. Attribute VB_Exposed = False
  30. Option Explicit
  31. Private Const PI = 3.14159265
  32. Private NumSegments As Integer
  33. ' Hold two points for a line segment.
  34. Private Type Segment
  35.     fr_pt(1 To 3) As Single
  36.     to_pt(1 To 3) As Single
  37.     fr_tr(1 To 3) As Single
  38.     to_tr(1 To 3) As Single
  39. End Type
  40. Private Segments() As Segment
  41. Private theta As Single
  42. ' Create the data.
  43. Private Sub CreateData()
  44.     ' Create the axes.
  45.     MakeSegment 0, 0, 5, 0
  46.     MakeSegment 0, 0, 0, 5
  47.     ' Create an object to manipulate.
  48.     MakeSegment 1, 1, 3, 1
  49.     MakeSegment 3, 1, 3, 3
  50.     MakeSegment 3, 3, 1, 3
  51.     MakeSegment 1, 3, 1, 1
  52.     MakeSegment 1, 1, 3, 3
  53.     MakeSegment 3, 1, 1, 3
  54. End Sub
  55. ' Draw the transformed data.
  56. Private Sub DrawSegments(pic As Object)
  57. Dim T(1 To 3, 1 To 3) As Single
  58. Dim i As Integer
  59. Dim x1 As Single
  60. Dim y1 As Single
  61. Dim x2 As Single
  62. Dim y2 As Single
  63.     pic.Cls
  64.     ' Transform the picture.
  65.     m2RotateAround T, theta, 2, 2
  66.     TransformPicture T
  67.     For i = 1 To NumSegments
  68.         x1 = Segments(i).fr_tr(1)
  69.         y1 = Segments(i).fr_tr(2)
  70.         x2 = Segments(i).to_tr(1)
  71.         y2 = Segments(i).to_tr(2)
  72.         pic.Line (x1, y1)-(x2, y2)
  73.     Next i
  74. End Sub
  75. ' Change the angle of rotation and redraw.
  76. Private Sub Form_KeyDown(KeyCode As Integer, Shift As Integer)
  77. Const Dtheta = PI / 16
  78.     Select Case KeyCode
  79.         Case vbKeyLeft   ' Rotate left.
  80.             theta = theta + Dtheta
  81.         Case vbKeyRight  ' Rotate right.
  82.             theta = theta - Dtheta
  83.     End Select
  84.     picCanvas.Refresh
  85. End Sub
  86. ' Load the data.
  87. Private Sub Form_Load()
  88.     theta = 0
  89.     CreateData
  90. End Sub
  91. ' Make a new line segment.
  92. Private Sub MakeSegment(x1 As Single, y1 As Single, x2 As Single, y2 As Single)
  93.     NumSegments = NumSegments + 1
  94.     ReDim Preserve Segments(1 To NumSegments)
  95.     Segments(NumSegments).fr_pt(1) = x1
  96.     Segments(NumSegments).fr_pt(2) = y1
  97.     Segments(NumSegments).fr_pt(3) = 1
  98.     Segments(NumSegments).to_pt(1) = x2
  99.     Segments(NumSegments).to_pt(2) = y2
  100.     Segments(NumSegments).to_pt(3) = 1
  101. End Sub
  102. ' Transform all segments except the axes.
  103. Private Sub TransformPicture(M() As Single)
  104. Dim i As Integer
  105.     For i = 1 To 2
  106.         m2PointCopy Segments(i).fr_tr, Segments(i).fr_pt
  107.         m2PointCopy Segments(i).to_tr, Segments(i).to_pt
  108.     Next i
  109.     For i = 3 To NumSegments
  110.         m2Apply Segments(i).fr_pt, M, Segments(i).fr_tr
  111.         m2Apply Segments(i).to_pt, M, Segments(i).to_tr
  112.     Next i
  113. End Sub
  114. Private Sub picCanvas_Paint()
  115.     DrawSegments picCanvas
  116. End Sub
  117.